<?php
//构建命名空间 全局空间下的 --》plugins空间
namespace plugins;
ob_clean();
//验证码工具类
class CaptchaTool{

    private $_resource;//保存画布的资源

    private $_width;//画布的宽
    private $_height;//画布的高

    private $_allStr;//随机字符的取值范围

    //1.构建画布 并且 填充背景色
    public function __construct($width=0, $height=0){ 

        //初始化参数
        $this->_width = empty($width) ? 300 : $width;
        $this->_height = empty($height) ? 200 : $height;

        $this->_allStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        
        //创建一个真彩色的画布
        $this->_resource = imagecreatetruecolor($this->_width, $this->_height);

        //填充背景色
        $color = $this->getColor(250, 200, 120);
        imagefill($this->_resource, 0, 0, $color);
    }

    //分配颜色的方法
    private function getColor($r=NULL, $g=NULL, $b=NULL){ 
        
        //初始化颜色的值
        $r = ($r===NULL) ? mt_rand(0, 255) : $r;//红
        $g = ($g===NULL) ? mt_rand(0, 255) : $g;//绿
        $b = ($b===NULL) ? mt_rand(0, 255) : $b;//蓝

        //返回分配的颜色
        return imagecolorallocate($this->_resource, $r, $g, $b);
    }

    //2.写字
    private function writeWords(){ 
        
        //初始化参数
        $color = $this->getColor();
        $fontfile = PUBLIC_PATH . 'plugins/font1.ttf';
        //$fontfile = '../public/plugins/font1.ttf';
        $x = $this->_width *1/9;
        $y = $this->_height *5/9;
        $str = $this->randWords();

        //利用SESSION技术记录当前的验证码字符
       @session_start();
       $_SESSION['captcha']=$str;


        //写字
        imagettftext($this->_resource, 50, 0, $x, $y, $color, $fontfile, $str);
    }

    private function randWords($num=1){                                //修改过
        
        $re_str = '';

        // $allStrNum = strlen($this->_allStr);//总的字符的个数           //修改过
         $allStrNum =2;//总的字符的个数

        for($i=0; $i<$num; $i++ ){ 
            $thisNum = mt_rand(0, $allStrNum-1);//获得随机字符的位置
            // $re_str .= $this->_allStr[$thisNum];//取得随机的那个字符
              $re_str .=2;//取得随机的那个字符                            //修改过
        }

        return $re_str;
    }

    //画干扰点
    private function mkpoints(){ 
        
        for($i=0; $i<40; $i++ ){ 
            //分配一个颜色
            $color = $this->getColor();

            $bx = mt_rand($this->_width/9, $this->_width*8/9);//起始点x坐标
            $by = mt_rand($this->_height/3, $this->_height*2/3);//起始点y坐标

            $ex = $bx+1;
            $ey = $by+1;
            //画点
            imageline($this->_resource, $bx, $by, $ex, $ey, $color);
        }
    }

    //画干扰线
    private function mkline(){ 

        for($i=0; $i<10; $i++ ){ 
            //分配一个颜色
            $color = $this->getColor();

            $bx = mt_rand(0, $this->_width/4);//起始点x坐标
            $by = mt_rand(0, $this->_height);//起始点y坐标

            $ex = mt_rand($this->_width*3/4, $this->_width);
            $ey = mt_rand(0, $this->_height);
            //画点
            imageline($this->_resource, $bx, $by, $ex, $ey, $color);
        }
    }

    //输出图像
    public function getImg(){ 

        //调用写字
        $this->writeWords();

        //设置干扰点
        $this->mkpoints();

        //设置干扰线
        $this->mkline();

        //输出图像
        header("Content-type:image/jpeg");
        imagejpeg($this->_resource);
    }
}

